#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>
#include <string>



//实现 视同 pthread 库里面的函数，基本代码

//证明 线程id 是输出函数，看看线程id 是什么

//打印 主线程id 与 线程id

//验证 创建 线程时 运行自定义的函数 返回值 会被 join回收

int flag = 100; // 全局变量 在多线程是共享的，也就是 地址是共享的； 函数也是如此

void showid(pthread_t &tid)
{
    printf("tid: 0x%lx\n", tid);
}

std::string FormatId(const pthread_t &tid)
{
    char id[64];
    snprintf(id, sizeof id,"0x%lx", tid);
    return id;
}

void* routine(void* arg)
{
    std::string name = (const char*)arg;
    pthread_t t = pthread_self();

    int cnt = 5;
    while(cnt--)
    {
        std::cout << "我是新线程, name:" << name << "我的id:" << FormatId(t) << std::endl;
        sleep(1);
        flag++;
    }

    return (void*)200;// 暂时：线程退出的时候的退出码
}
int main()
{
    pthread_t tid;
    int n = pthread_create(&tid, nullptr, routine, (void*)"thread-1");
    showid(tid);
    int cnt = 5;
    while(cnt--)
    {
        std::cout << "我是主线程..." << ", 我的id:" << FormatId(tid)
        << ", flag:" << flag << std::endl;
        sleep(1);
    }

    void* ret = nullptr;// ret也是一个变量！！也有空间哦

    // 等待的目标线程，如果异常了，整个进程都退出了，包括main线程，所以，join异常，没有意义，看也看不到！
    // jion都是基于：线程健康跑完的情况，不需要处理异常信号，异常信号，是进程要处理的话题！！！
    pthread_join(tid, &ret); // 为什么在join的时候，没有见到异常相关的字段呢？？

    std::cout << "ret is:   " << (long long int)ret << std::endl;
    return 0;
}


//c++ 线程demo  
// #include <thread>

// void* hello()
// {
//     while(true)
//     {
//         std::cout << "新线程hello, pid:" << getpid() << std::endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     std::thread t(hello);

//     while(true)
//     {
//         std::cout << "主进程..., pid:" << getpid() << std::endl;
//         sleep(1);
//     }
//     t.join();
//     return 0;
// }





//验证创建 线程
//验证是 统一进程， 是轻量级进程，线程是进程的一部分

// void* threadrun(void* arg)
// {
//     std::string name = (const char*)arg;
    
//     while(true)
//     {
//         std::cout << "我是新线程 name:" << name << ", pid :" << getpid() << std::endl;
//         sleep(1);

//     }
//     return nullptr;
// }

// int main()
// {
//     pthread_t tid;
//     pthread_create(&tid, nullptr,  threadrun, (void*)"thread-1");

//     while(true)
//      {
//          std::cout << "我是主线程...." << ", pid : "<< getpid()  << std::endl;
//          sleep(1);
//      }
//     return 0;
//  }